package com.yuhuihui.common.utils;

import com.yuhuihui.common.domain.BaseTreeEntity;
import org.springframework.util.CollectionUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * tree工具类
 *
 * @author yuhh
 * @date 2023-05-25 14:47:24
 */
public final class TreeUtil {

    /**
     * 默认的最顶层的父id
     */
    private static final int DEFAULT_P_ID = 0;

    /**
     * 获取tree列表
     *
     * @param list 需要转换的列表
     * @return {@link List }<{@link T }> tree列表
     * @author yuhh
     * @date 2023-05-25 14:47:31
     */
    public static <T extends BaseTreeEntity<T>> List<T> getTree(List<T> list){
        return getTree(list, DEFAULT_P_ID);
    }

    /**
     * 获取tree列表
     *
     * @param list 需要转换的列表
     * @param pId  父id
     * @return {@link List }<{@link T }> tree列表
     * @author yuhh
     * @date 2023-05-25 14:47:35
     */
    public static <T extends BaseTreeEntity<T>> List<T> getTree(List<T> list, int pId){
        // 根据父id分组，得到Map<父id, 数据列表>
        Map<Integer, List<T>> map = list.stream().collect(Collectors.groupingBy(T::getParentId));
        // 最顶层的数据列表
        List<T> pList = map.get(pId);
        return getChildrenNode(pList, map);
    }

    /**
     * 获取子节点
     *
     * @param list 父列表
     * @param map  Map<父id, 数据列表>
     * @return {@link List }<{@link T }> 树结构数据
     * @author yuhh
     * @date 2023-05-25 14:47:43
     */
    private static <T extends BaseTreeEntity<T>> List<T> getChildrenNode(List<T> list, Map<Integer, List<T>> map) {
        List<T> childrenParams = new ArrayList<>();
        // 子数据列表
        List<T> cList;
        for (T t: list){
            cList = map.get(t.getId());
            if (!CollectionUtils.isEmpty(cList)){
                t.setChildren(getChildrenNode(cList, map));
            }
            childrenParams.add(t);
        }
        return childrenParams;
    }
    
    private TreeUtil(){
        
    }
}
